#include "unity.h"
#include "logger.h"
#include <memory>

// 测试创建带标记的Logger实例
void test_create_logger_with_tag(void) {
    auto logger = multi_sink::Logger::createLogger("TEST_TAG");
    TEST_ASSERT_NOT_NULL(logger);
    
    // 记录一些日志进行测试
    logger->info("Test info message with tag");
    logger->warn("Test warn message with tag");
    logger->error("Test error message with tag");
    
    // 销毁日志记录器
    logger->destroy();
}

// 测试创建多个Logger实例
void test_create_multiple_loggers(void) {
    auto logger1 = multi_sink::Logger::createLogger("TAG1");
    auto logger2 = multi_sink::Logger::createLogger("TAG2");
    
    TEST_ASSERT_NOT_NULL(logger1);
    TEST_ASSERT_NOT_NULL(logger2);
    
    // 记录一些日志进行测试
    logger1->info("Message from logger1");
    logger2->info("Message from logger2");
    
    // 销毁日志记录器
    logger1->destroy();
    logger2->destroy();
}

// 测试信息日志记录函数
void test_log_info(void) {
    auto logger = multi_sink::Logger::createLogger("TEST_INFO");
    // 记录信息日志
    logger->info("Test info message");
    // 这里我们主要测试函数是否能正常调用，不抛出异常即可
    logger->destroy();
    TEST_PASS();
}

// 测试警告日志记录函数
void test_log_warn(void) {
    auto logger = multi_sink::Logger::createLogger("TEST_WARN");
    // 记录警告日志
    logger->warn("Test warn message");
    // 这里我们主要测试函数是否能正常调用，不抛出异常即可
    logger->destroy();
    TEST_PASS();
}

// 测试错误日志记录函数
void test_log_error(void) {
    auto logger = multi_sink::Logger::createLogger("TEST_ERROR");
    // 记录错误日志
    logger->error("Test error message");
    // 这里我们主要测试函数是否能正常调用，不抛出异常即可
    logger->destroy();
    TEST_PASS();
}

// 测试销毁函数
void test_destroy_logger(void) {
    auto logger = multi_sink::Logger::createLogger("TEST_DESTROY");
    // 销毁日志记录器
    logger->destroy();
    // 这里我们主要测试函数是否能正常调用，不抛出异常即可
    TEST_PASS();
}

// 设置函数
void setUp(void) {
    // 在每个测试函数运行前执行
}

// 清理函数
void tearDown(void) {
    // 在每个测试函数运行后执行
}

// 主函数
int main(void) {
    UNITY_BEGIN();
    RUN_TEST(test_create_logger_with_tag);
    RUN_TEST(test_create_multiple_loggers);
    RUN_TEST(test_log_info);
    RUN_TEST(test_log_warn);
    RUN_TEST(test_log_error);
    RUN_TEST(test_destroy_logger);
    return UNITY_END();
}